#pragma once

#include "BasicTypes.h"

#include <functional>
#include <string>

namespace MOE
{
	namespace Core
	{
        class ClassMeta;
        class Type;

		// Defines a meta object method that can be called on an object.
		// Currently, all methods are non-static. You will have to pass in the object for every method call.
		class Method
		{
		public:
			// Default invalid method.
			static const Method kInvalid;

		public:
			// No public constructor - all Method instances are created by template static functions that creates inherited classes.

			// Virtual destructor.
			virtual ~Method();

			// Gets the name of the method.
			const char8* GetName() const { return mMethodName.c_str(); }

			// Gets the return type.
			const Type& GetReturnType() const { return mReturnType; }

			// Gets the number of arguments required for this method.
			tSize GetNumArguments() const { return mNumArguments; }

		private:
			// Temporary constructor before we figure out what we want to do with this class.
			// Creates an empty method.
			Method();

		private:
			std::string mMethodName;
			const Type& mReturnType;
			tSize mNumArguments;
		};

	}
}
